/*
 * Diccionario.cpp
 *
 *  Created on: Jun 10, 2014
 *      Author: carlos
 */

#include "Diccionario.h"
#include <cstdio>

Diccionario::Diccionario() {
	this->loadInitialTable();

}

Diccionario::~Diccionario() {
}

void Diccionario::showDictionary() {
	map<int,string>::iterator itMyDictionary;
	itMyDictionary=this->mydictionary.begin();

	while (itMyDictionary != this->mydictionary.end()) {
			 cout<<"key :"<<(*itMyDictionary).first<<" value: "<< (*itMyDictionary).second<<endl;;
			 itMyDictionary++;
	}
}

/**
 * Agrega al diccionario. No valida que exista lo agrega
 * devuelve el codigo con el que se agrego.
 */
void Diccionario::append(string value) {
	if(value.length()>=2){//El diccionario se inicializa con todos los caracteres posibles de 1 byte
		int codigo=this->mydictionary.size();
		this->mydictionary[codigo]=value;
		this->mydictionaryInverted[value]=codigo;
		tamanio++;
	}
}

int Diccionario::getCodigo(string value) {
	return this->mydictionaryInverted[value];
}

int Diccionario::getSize() {
	return tamanio;
}

string Diccionario::getValue(int codigo) {
	return this->mydictionary[codigo];
}



/**
 * Carga de la tabla inicial con la tabla ascii
 */
void Diccionario::loadInitialTable() {

	 for (int i = 0; i < 256; i++) {
		 this->mydictionary[i]=StringUtils::charToString((char)i);
		 this->mydictionaryInverted[StringUtils::charToString((char)i)]=i;
	}
	tamanio=255;
}



bool Diccionario::isInTableCode(int code) {
	bool isInTable=true;
	if(this->mydictionary.size()-1<code){
		isInTable=false;
	}
	return isInTable;
}
bool Diccionario::isInTable(string value) {
	bool isInTable=true;
	int intValue=this->mydictionaryInverted[value];
	//si es cero veo si realmente esta o no;
	if(intValue==0){
		if(StringUtils::charToString((char)intValue)==value){
			isInTable=true;
		}else{
			isInTable=false;
		}
	}
	return isInTable;

}
